#ifndef RATINGMANAGER_H
#define RATINGMANAGER_H

#include <QObject>
#include <QString>
#include <QList>
#include <QDateTime>
#include <QMutex>
#include "../data/models.h"
#include "../data/datamanager.h"
#include "../utils/errorhandler.h"

/**
 * @brief 评价管理器
 * 
 * 负责订单评价的创建、管理和统计功能
 * 提供评价数据的增删改查和统计分析服务
 */

namespace RestaurantSystem {

/**
 * @brief 评价操作结果枚举
 */
enum class RatingOperationResult {
    SUCCESS = 0,              // 操作成功
    RATING_NOT_FOUND,        // 评价不存在
    ORDER_NOT_FOUND,         // 订单不存在
    ALREADY_RATED,           // 已经评价过
    INVALID_DATA,            // 数据无效
    PERMISSION_DENIED,       // 权限不足
    SYSTEM_ERROR             // 系统错误
};

/**
 * @brief 评价统计信息
 */
struct RatingStatistics {
    int totalRatings = 0;           // 总评价数
    double averageRating = 0.0;     // 平均评分
    QList<int> ratingDistribution;  // 评分分布 [1星数量, 2星数量, ..., 5星数量]
    int fiveStarCount = 0;          // 5星数量
    int fourStarCount = 0;          // 4星数量
    int threeStarCount = 0;         // 3星数量
    int twoStarCount = 0;           // 2星数量
    int oneStarCount = 0;           // 1星数量
    double satisfactionRate = 0.0;  // 满意度(4-5星比例)
    
    RatingStatistics() {
        ratingDistribution = QList<int>{0, 0, 0, 0, 0}; // 初始化为5个0
    }
    
    // 计算满意度
    void calculateSatisfactionRate() {
        if (totalRatings > 0) {
            satisfactionRate = (double)(fourStarCount + fiveStarCount) / totalRatings * 100.0;
        }
    }
};

/**
 * @brief 评价搜索条件
 */
struct RatingSearchCriteria {
    QString customerName;    // 顾客用户名过滤
    QString orderId;         // 订单ID过滤
    int minRating = -1;      // 最小评分
    int maxRating = -1;      // 最大评分
    QDateTime startDate;     // 开始日期
    QDateTime endDate;       // 结束日期
    QString keyword;         // 关键词搜索(在评价内容中搜索)
    
    RatingSearchCriteria() = default;
    
    bool hasFilters() const {
        return !customerName.isEmpty() || !orderId.isEmpty() ||
               (minRating >= 1 && maxRating >= 1) ||
               startDate.isValid() || endDate.isValid() || !keyword.isEmpty();
    }
};

/**
 * @brief 评价管理器类
 */
class RatingManager : public QObject {
    Q_OBJECT
    
public:
    explicit RatingManager(QObject* parent = nullptr);
    ~RatingManager();
    
    /**
     * @brief 获取单例实例
     */
    static RatingManager& instance();
    
    /**
     * @brief 初始化评价管理器
     * @return 初始化是否成功
     */
    bool initialize();
    
    // ========================================================================
    // 评价创建和管理
    // ========================================================================
    
    /**
     * @brief 创建评价
     * @param orderId 订单ID
     * @param customerId 顾客ID
     * @param rating 评分(1-5)
     * @param comment 评价内容
     * @return 操作结果和评价ID
     */
    QPair<RatingOperationResult, QString> createRating(const QString& orderId, 
                                                       const QString& customerName,
                                                       int rating, 
                                                       const QString& comment = "");
    
    /**
     * @brief 获取所有评价
     * @return 评价列表
     */
    QList<Rating> getAllRatings();
    
    /**
     * @brief 根据ID获取评价
     * @param id 评价ID
     * @return 评价信息，不存在则返回无效对象
     */
    Rating getRatingById(const QString& id);
    
    /**
     * @brief 根据订单ID获取评价
     * @param orderId 订单ID
     * @return 评价信息，不存在则返回无效对象
     */
    Rating getRatingByOrderId(const QString& orderId);
    
    /**
     * @brief 根据顾客ID获取评价
     * @param customerId 顾客ID
     * @return 评价列表
     */
    QList<Rating> getRatingsByCustomerName(const QString& customerName);
    
    /**
     * @brief 搜索评价
     * @param criteria 搜索条件
     * @return 符合条件的评价列表
     */
    QList<Rating> searchRatings(const RatingSearchCriteria& criteria);
    
    /**
     * @brief 更新评价
     * @param rating 评价信息
     * @return 操作结果
     */
    RatingOperationResult updateRating(const Rating& rating);
    
    /**
     * @brief 删除评价
     * @param ratingId 评价ID
     * @return 操作结果
     */
    RatingOperationResult deleteRating(const QString& ratingId);
    
    // ========================================================================
    // 评价验证
    // ========================================================================
    
    /**
     * @brief 检查订单是否可以评价
     * @param orderId 订单ID
     * @param customerId 顾客ID
     * @return 是否可以评价
     */
    bool canRateOrder(const QString& orderId, const QString& customerName);
    
    /**
     * @brief 检查订单是否已经评价
     * @param orderId 订单ID
     * @return 是否已评价
     */
    bool isOrderRated(const QString& orderId);
    
    /**
     * @brief 验证评价数据
     * @param rating 评价信息
     * @return 验证结果
     */
    ValidationResult validateRating(const Rating& rating);
    
    // ========================================================================
    // 统计和分析
    // ========================================================================
    
    /**
     * @brief 获取评价统计信息
     * @param startDate 开始日期(可选)
     * @param endDate 结束日期(可选)
     * @return 统计信息
     */
    RatingStatistics getRatingStatistics(const QDateTime& startDate = QDateTime(), 
                                        const QDateTime& endDate = QDateTime());
    
    /**
     * @brief 获取顾客评价统计
     * @param customerId 顾客ID
     * @return 统计信息
     */
    RatingStatistics getCustomerRatingStatistics(const QString& customerName);
    
    /**
     * @brief 获取最近评价列表
     * @param limit 返回数量限制
     * @return 最近评价列表
     */
    QList<Rating> getRecentRatings(int limit = 10);
    
    /**
     * @brief 获取高评分评价列表
     * @param minRating 最小评分
     * @param limit 返回数量限制
     * @return 高评分评价列表
     */
    QList<Rating> getHighRatedRatings(int minRating = 4, int limit = 10);
    
    // ========================================================================
    // 辅助方法
    // ========================================================================
    
    /**
     * @brief 生成唯一评价ID
     * @return 评价ID
     */
    static QString generateRatingId();
    
    /**
     * @brief 获取操作结果描述
     * @param result 操作结果
     * @return 描述字符串
     */
    static QString getOperationResultMessage(RatingOperationResult result);
    
    /**
     * @brief 格式化评分显示
     * @param rating 评分
     * @return 格式化字符串(如"★★★★☆")
     */
    static QString formatRatingStars(int rating);
    
    /**
     * @brief 获取评分等级描述
     * @param rating 评分
     * @return 等级描述
     */
    static QString getRatingLevelText(int rating);

signals:
    /**
     * @brief 评价创建信号
     * @param rating 创建的评价
     */
    void ratingCreated(const Rating& rating);
    
    /**
     * @brief 评价更新信号
     * @param ratingId 评价ID
     * @param oldRating 原评价
     * @param newRating 新评价
     */
    void ratingUpdated(const QString& ratingId, const Rating& oldRating, const Rating& newRating);
    
    /**
     * @brief 评价删除信号
     * @param ratingId 评价ID
     */
    void ratingDeleted(const QString& ratingId);
    
    /**
     * @brief 评价统计更新信号
     * @param statistics 最新统计信息
     */
    void statisticsUpdated(const RatingStatistics& statistics);
    
    /**
     * @brief 评价数据变更信号
     */
    void ratingsChanged();

public slots:
    /**
     * @brief 刷新评价数据
     */
    void refreshRatingData();

private slots:
    void onExternalFileChanged(DataType dataType, const QString& filePath);

private:
    /**
     * @brief 加载评价数据到缓存
     * @return 操作是否成功
     */
    bool loadRatingData();
    
    /**
     * @brief 保存评价数据
     * @return 操作是否成功
     */
    bool saveRatingData();
    
    /**
     * @brief 验证评价搜索条件
     * @param rating 评价
     * @param criteria 搜索条件
     * @return 是否匹配
     */
    bool matchesSearchCriteria(const Rating& rating, const RatingSearchCriteria& criteria);
    
    /**
     * @brief 计算评价统计
     * @param ratings 评价列表
     * @return 统计信息
     */
    RatingStatistics calculateStatistics(const QList<Rating>& ratings);
    
    /**
     * @brief 安全地重新加载评价数据（用于外部文件变更）
     */
    void safeReloadRatingData();

private:
    static RatingManager* s_instance;
    
    DataManager* m_dataManager;
    
    // 缓存数据
    QList<Rating> m_ratings;
    
    // 线程安全
    mutable QMutex m_mutex;
    
    // 状态标识
    bool m_isInitialized;
    bool m_dataLoaded;
};

} // namespace RestaurantSystem

#endif // RATINGMANAGER_H
